/**
 * 
 */
package ar.utn.frgp.banco.front.action.operaciones;

import java.math.BigDecimal;
import java.util.List;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.enums.TipoCuenta;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.front.action.EBAbstractAction;
import ar.utn.frgp.banco.service.GestionCuentasService;

/**
 * @author Jonni
 *
 */
public class TransferenciaAction extends EBAbstractAction{

	/**
	 * 
	 */
	private static final long serialVersionUID = -563815138972103228L;

	private List<Cuenta> cuentas;
	private List<Cuenta> cuentas2;
	
	private Long idCuenta;
	private Long idCuenta2;
	
	private BigDecimal monto;
	
	private GestionCuentasService gestionCuentasService;
	
	/* (non-Javadoc)
	 * @see ar.utn.frgp.banco.front.action.EBAbstractAction#execute()
	 */
	@Override
	public String execute() throws PersonalisedException {
		// TODO Auto-generated method stub
		
		if (cuentas == null){
			cuentas = gestionCuentasService.obteneCuentas(getLoggedUser().getDni());
			
			if (cuentas.isEmpty()){
				return NONE;
			}
		}
		
		if (cuentas2 == null){
			cuentas2 = gestionCuentasService.obteneCuentas(getLoggedUser().getDni());
			
			if (cuentas2.isEmpty()){
				return NONE;
			}
		}
	
		
		try {
			
			if(idCuenta != null && idCuenta2 != null){
				
				Cuenta cuenta = gestionCuentasService.obtenerCuentaCompleta(idCuenta);
				BigDecimal comision = new BigDecimal(1.0006);
				
				if(cuenta.getTipoCuenta() == TipoCuenta.CUENTA_CORRIENTE){
						monto = monto.multiply(comision);
					}

				
				Cuenta cuenta2 = gestionCuentasService.obtenerCuentaCompleta(idCuenta2);
				BigDecimal comision2 = new BigDecimal(0.9994);
				
				if(cuenta2.getTipoCuenta() == TipoCuenta.CUENTA_CORRIENTE){
					monto = monto.multiply(comision2);
				}
				
				gestionCuentasService.transferencia(idCuenta, monto, idCuenta2);
				
				return SUCCESS;
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			addActionError("No dispone del saldo para hacer esta operacion");
			return ERROR;
		}
		return INPUT;
	}

	/**
	 * @return the cuentas2
	 */
	public List<Cuenta> getCuentas2() {
		return cuentas2;
	}

	/**
	 * @param cuentas2 the cuentas2 to set
	 */
	public void setCuentas2(List<Cuenta> cuentas2) {
		this.cuentas2 = cuentas2;
	}

	/**
	 * @return the cuentas
	 */
	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	/**
	 * @param cuentas the cuentas to set
	 */
	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

	/**
	 * @return the idCuenta
	 */
	public Long getIdCuenta() {
		return idCuenta;
	}

	/**
	 * @param idCuenta the idCuenta to set
	 */
	public void setIdCuenta(Long idCuenta) {
		this.idCuenta = idCuenta;
	}

	/**
	 * @return the idCuenta2
	 */
	public Long getIdCuenta2() {
		return idCuenta2;
	}

	/**
	 * @param idCuenta2 the idCuenta2 to set
	 */
	public void setIdCuenta2(Long idCuenta2) {
		this.idCuenta2 = idCuenta2;
	}

	/**
	 * @return the monto
	 */
	public BigDecimal getMonto() {
		return monto;
	}

	/**
	 * @param monto the monto to set
	 */
	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}

	/**
	 * @return the gestionCuentasService
	 */
	public GestionCuentasService getGestionCuentasService() {
		return gestionCuentasService;
	}

	/**
	 * @param gestionCuentasService the gestionCuentasService to set
	 */
	public void setGestionCuentasService(GestionCuentasService gestionCuentasService) {
		this.gestionCuentasService = gestionCuentasService;
	}

}
